#include <REGX52.H>
#include "Int0.h"
#include "Timer.h"

//State=0，空闲状态
//State=1，接收状态，接收Start信号，Repeat信号
//State=2，接收数据
unsigned char IR_State, DataReady, RepeatFlag;
//红外信号的地址和命令
unsigned char Address, Command;
//存储数据的数组和读取的位数
unsigned char DataArr[4], DataBit;


/**
  * @brief		IR初始化
  * @parm		无
  * @retval		无
  */
void IR_Init()
{
	Timer0_Init();	//计时器初始化
	Int0_Init();	//外部中断0初始化
}
/**
  * @brief		获取红外信号中的地址信息
  * @parm		无
  * @retval		地址信息
  */
unsigned char IR_GetAddress()
{
	return Address;
}
/**
  * @brief		获取红外信号中的命令信息
  * @parm		无
  * @retval		命令字：16进制
  */
unsigned char IR_GetCommand()
{
	return Command;
}
/**
  * @brief		获取红外信号中的命令信息
  * @parm		无
  * @retval		命令字：16进制
  */
unsigned char IR_DataReady()
{
	if(DataReady){
		DataReady = 0;//清零
		return 1;
	}
	return 0;
}
/**
  * @brief		获取红外信号中的命令信息
  * @parm		无
  * @retval		命令字：16进制
  */
unsigned char IR_GetRepeatFlag()
{
	if(RepeatFlag){
		RepeatFlag = 0;//清零
		return 1;
	}
	return 0;
}

//外部中断0处理函数，持续检测信号
void Int0_Routine() interrupt 0
{
	unsigned int Time;
	if(IR_State == 0)//空闲状态
	{
		Timer0_SetValue(0);	//计时器清零
		Timer0_Run(1);		//启动计数器
		IR_State = 1;		//切换置监听开始/重复信号
	}
	else if(IR_State == 1)//接收开始信号&重复信号
	{
		Time = Timer0_GetValue();	//获取两次下降沿之间的间隔
		Timer0_SetValue(0);			//计时器清零
		//如果计时为13.5ms，则接收到了Start信号（判定值在12MHz晶振下为13500，在11.0592MHz晶振下为12442）
		if(Time > 12442 - 500 && Time < 12442 + 500)
			IR_State = 2;
		//如果计时为11.25ms，则接收到了Repeat信号（判定值在12MHz晶振下为11250，在11.0592MHz晶振下为10368）
		else if(Time > 10368 - 500 && Time < 10368 + 500)
		{
			RepeatFlag = 1;	//连发标志位
			Timer0_Run(0);		//停止计时器
			IR_State = 0;		//空闲状态
		}
		else	//接收错误信号
			IR_State = 1;		//重新检测
	}
	else if(IR_State == 2)
	{
		Time = Timer0_GetValue();	//获取两次下降沿之间的间隔
		Timer0_SetValue(0);			//计时器清零
		//如果计时为1120us，则接收到了数据0（判定值在12MHz晶振下为1120，在11.0592MHz晶振下为1032）
		if(Time > 1032 - 500 && Time < 1032 + 500)
		{
			DataArr[DataBit/8] &= ~(0x01 << (DataBit % 8));//数据先发低位
			DataBit++;
		}
		//如果计时为2250us，则接收到了数据1（判定值在12MHz晶振下为2250，在11.0592MHz晶振下为2074）
		else if(Time > 2074 - 500 & Time < 2074 + 500)
		{
			DataArr[DataBit/8] |= (0x01 << (DataBit % 8));//数据先发低位
			DataBit++;
		}
		else
		{
			//数据错误，重新接受
			IR_State = 1;
			DataBit = 0;
		}
		
		if(DataBit >= 32){//接收数据完成
			if((DataArr[0] == ~DataArr[1]) && (DataArr[2] == ~DataArr[3])){
				Address = DataArr[0], Command = DataArr[2];
				DataReady = 1;
			}
			DataBit = 0;		//数据位清零
			IR_State = 0;		//回到空闲状态
			Timer0_Run(0);		//计时器停止
		}
	}
}	












